#include "curso.h"

/**
 * TODO
 * @param curso
 * @return
 */
int create_curso(Curso* curso) {
    FILE *file = NULL;

    // busca proxima matricula válida
    curso->id = next_sequence(CURSO_SEQ);
    if (curso->id != NOT_FOUND) {
        file = fopen(CURSO_DB, "ab+");
        if (file) {
            if (!fwrite(curso, sizeof (Curso), 1, file)) {
                printf(CREATE_ERROR, "curso");
                fclose(file);
                return PROC_FAILURE;
            }
            fclose(file);
        }
        return PROC_SUCCESS;
    }
    return PROC_FAILURE;
}

int read_all_curso() {
    FILE *file = NULL;
    Curso *curso;

    file = fopen(CURSO_DB, "rb");
    if (file) {
        curso = (Curso *) malloc(sizeof (Curso));
        if (!curso) {
            printf(INSUFICIENT_MEMORY, "Curso");
            return PROC_FAILURE;
        }
        puts("Lista de Cursos\n");
        printf("%3s %20s %20s\n", "ID", "Curso", "Nível");
        puts("---------------------------------------------\n");
        /* lê a primeira vez para evitar fim do arquivo na primeira linha. */
        fread(curso, sizeof (Curso), 1, file);
        while (!feof(file)) {
            printf("%03d %20s %20s\n", curso->id, curso->descricao, curso->nivel);
            fread(curso, sizeof (Curso), 1, file);
        }
        printf("\n\n");
        fclose(file);
        free(curso);
        return PROC_SUCCESS;
    } else {
        return PROC_FAILURE;
    }
}

Curso * get_curso(int id) {
    FILE *file = NULL;
    Curso *curso = NULL;

    curso = (Curso *) malloc(sizeof (Curso));
    if (!curso) {
        printf(INSUFICIENT_MEMORY, "Curso");
        return NULL;
    }
    curso->id = NOT_FOUND;

    file = fopen(CURSO_DB, "rb");
    if (file) {
        fread(curso, sizeof (Curso), 1, file);
        while (!feof(file)) {
            if (curso->id == id) {
                return curso;
            }
            fread(curso, sizeof (Curso), 1, file);
        }
        fclose(file);
        return curso;
    } else {
        printf(OPEN_FILE_ERROR, CURSO_DB);
        return curso;
    }
}

/**
 * TODO
 * listar cursos por nivel
 * @return
 */
int list_curso_by_nivel() {
    Curso *array = (Curso *) curso_to_a();

    const char niveis[NUM_NIVEIS][50] = {"SUPERIOR", "TÉCNICO"};

    if (array != NULL) {
        int i, size;
        size = curso_size();
        for (i = 0; i < NUM_NIVEIS; i++) {
            print_only_nivel(niveis[i], size, array);
        }
        free(array);
        return PROC_SUCCESS;
    } else {
        free(array);
        return PROC_FAILURE;
    }
}

void print_only_nivel(const char *nivel, int num_elements, Curso *list) {
    int i;
    for (i = 0; i < num_elements; i++) {
        if (strcmp((list + i)->nivel, nivel) == 0) {
            printf("Curso: %s.\nNível %s.\n", (list + i)->descricao, (list + i)->nivel);
        }
    }
}

int curso_size() {
    FILE *file = NULL;

    file = fopen(CURSO_DB, "rb");
    if (!file) {
        printf(READ_ERROR, CURSO_DB);
        fclose(file);
        return NOT_FOUND;
    }
    /* percorre o arquivo do inicio "0" até o fim "SEEK_END" */
    fseek(file, 0, SEEK_END);
    int size = ftell(file) / sizeof (Curso);
    fclose(file);
    return size;
}

Curso * curso_to_a() {
    FILE *file = NULL;
    Curso *array = NULL;
    int i, size;

    file = fopen(CURSO_DB, "rb");
    if (!file) {
        printf(READ_ERROR, CURSO_DB);
        fclose(file);
        return array;
    }

    size = curso_size();
    if (size == NOT_FOUND) {
        printf(EMPTY_DB, "Cursos");
        fclose(file);
        return array;
    }

    array = malloc(size * sizeof (Curso));
    if (!array) {
        printf(INSUFICIENT_MEMORY, "Curso");
        return array;
    }

    for (i = 0; i < size; i++) {
        fread((array + i), sizeof (Curso), 1, file);
    }
    return array;
}

void init_cursos() {
    Curso *curso;
    curso = ( Curso * ) malloc(sizeof(Curso));
    strcpy(curso->descricao, "ciencia da computação");
    strcpy(curso->nivel, "SUPERIOR");

    create_curso( curso );

    strcpy(curso->descricao, "automação comercial");
    strcpy(curso->nivel, "TÉCNICO");

    create_curso( curso );
}